package per.turtle.common.core.web.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpStatus;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import per.turtle.common.core.exception.BaseException;
import per.turtle.common.core.utils.sql.SqlInjectionUtils;
import per.turtle.common.core.web.entity.CommonResult;
import per.turtle.common.core.web.page.PageDomain;
import per.turtle.common.core.web.page.TableDataInfo;
import per.turtle.common.core.web.page.TableSupport;

import java.beans.PropertyEditorSupport;
import java.util.Date;
import java.util.List;
import java.util.function.Function;

/**
 * web层通用数据处理
 *
 * @author turtle
 */
public class BaseController {

    /**
     * 将前台传递过来的日期格式的字符串，自动转化为Date类型
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // Date 类型转换
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) {
                setValue(DateUtil.parseDate(text));
            }
        });
    }

    /**
     * 响应请求分页数据
     */
    protected <V> TableDataInfo<V> getDataTable(List<V> list) {
        TableDataInfo<V> rspData = new TableDataInfo<>();
        rspData.setCode(HttpStatus.HTTP_OK);
        rspData.setRows(list);
        rspData.setMsg("查询成功");
        rspData.setTotal(new PageInfo<>(list).getTotal());
        return rspData;
    }

    /**
     * 响应返回结果
     *
     * @param rowsNum 影响行数
     * @return 操作结果
     */
    protected CommonResult<Void> result(int rowsNum) {
        return rowsNum > 0 ? CommonResult.success() : CommonResult.error("操作失败，没有需要执行操作的记录！");
    }

    /**
     * 响应返回结果
     *
     * @param result 结果
     * @return 操作结果
     */
    protected CommonResult<Void> result(boolean result) {
        return result ? CommonResult.success() : CommonResult.error();
    }

    /**
     * 设置请求分页数据
     */
    protected <V> List<V> startPage(Function<Void, List<V>> function) {
        PageDomain pageDomain = TableSupport.getPageDomain();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        try {
            String orderBy = pageDomain.getOrderBy();
            // 检查 SQL 注入
            if (SqlInjectionUtils.checkIllegal(pageDomain.getOrderBy())) {
                throw new BaseException("参数不符合规范，无法进行查询！");
            }
            if (BeanUtil.isNotEmpty(pageNum) && BeanUtil.isNotEmpty(pageSize)) {
                PageHelper.startPage(pageNum, pageSize, orderBy);
            }
            return function.apply(null);
        } finally {
            PageHelper.clearPage();
        }
    }

}
